import type { PageParams, PageResult } from '@vben/types';

import { requestClient } from '#/api/request';

export namespace AppApi {
  /**
   * 应用信息
   */
  export interface App {
    /** 应用ID */
    id: string;
    /** 应用名称 */
    name: string;
    /** 应用描述 */
    description?: string;
    /** 应用图标 */
    icon?: string;
    /** 排序号 */
    displayOrder?: number;
    /** 所属空间ID */
    spaceId: string;
    /** 创建人 */
    createdBy?: string;
    /** 创建时间 */
    createdTime?: string;
    /** 最近修改人 */
    lastModifiedBy?: string;
    /** 最近修改时间 */
    lastModifiedTime?: string;
  }

  /**
   * 创建应用请求参数
   */
  export interface CreateAppRequest {
    /** 应用名称 */
    name: string;
    /** 应用描述 */
    description?: string;
    /** 应用图标 */
    icon?: string;
    /** 排序号 */
    displayOrder?: number;
    /** 所属空间ID */
    spaceId: string;
  }

  /**
   * 更新应用请求参数
   */
  export interface UpdateAppRequest {
    /** 应用ID */
    id: string;
    /** 应用名称 */
    name?: string;
    /** 应用描述 */
    description?: string;
    /** 应用图标 */
    icon?: string;
    /** 排序号 */
    displayOrder?: number;
    /** 所属空间ID */
    spaceId: string;
  }
}

/**
 * 获取空间下的所有应用
 * @param spaceId 空间ID
 */
export function getAppList(spaceId = 'spcc0jFwK2MYK') {
  return requestClient.get<AppApi.App[]>(`/apps/space/${spaceId}`);
}

/**
 * 分页获取空间下的应用
 * @param spaceId 空间ID
 * @param params 分页参数
 */
export function getAppListByPage(
  spaceId: string,
  params: PageParams & Record<string, any>,
) {
  return requestClient.post<PageResult<AppApi.App>>(
    `/apps/space/${spaceId}/page`,
    params,
  );
}

/**
 * 获取应用详情
 * @param appId 应用ID
 */
export function getAppDetail(appId: string) {
  return requestClient.get<AppApi.App>(`/apps/${appId}`);
}

/**
 * 创建应用
 * @param params 创建参数
 */
export function createApp(data: AppApi.CreateAppRequest) {
  return requestClient.post<AppApi.App>('/apps', data);
}

/**
 * 更新应用
 * @param appId 应用ID
 * @param params 更新参数
 */
export function updateApp(appId: string, params: Omit<AppApi.UpdateAppRequest, 'id'>) {
  return requestClient.put<AppApi.App>(`/apps/${appId}`, params);
}

/**
 * 删除应用
 * @param appId 应用ID
 */
export function deleteApp(appId: string) {
  return requestClient.delete(`/apps/${appId}`);
}
